﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MIAP.Entidades.Enums;

namespace MIAP.Entidades
{
    /// <summary>
    /// Clase que encapsula la información de la consulta de ejecución de proyectos
    /// </summary>
    [Serializable]
    public class ConsultaEjecucionProyectoInfo : IEqualityComparer<ConsultaEjecucionProyectoInfo>
    {
        /// <summary>
        /// Obtiene o establece el id del proyecto.
        /// </summary>
        public int IdProyecto { get; set; }

        /// <summary>
        /// Obtiene o establece el id del usuario.
        /// </summary>
        public int IdEjecutante { get; set; }

        /// <summary>
        /// Obtiene o establece el id del período de información.
        /// </summary>
        public int? IdPeriodoInformacion { get; set; }

        /// <summary>
        /// Nombre del proyecto
        /// </summary>
        public string NombreProyecto { get; set; }

        /// <summary>
        /// Obtiene o establece el periodo de carga asociado al proyecto.
        /// </summary>
        public string PeriodoCarga { get; set; }

        /// <summary>
        /// Obtiene o establece el periodo de información asociado al proyecto.
        /// </summary>
        public string PeriodoInformacion { get; set; }

        /// <summary>
        /// Obtiene o establece el año de ejecución.
        /// </summary>
        public int? Año { get; set; }

        /// <summary>
        /// Obtiene o establece el mes de ejecución.
        /// </summary>
        public int? Mes { get; set; }

        /// <summary>
        /// Campo de respaldo de la propiedad NombreMes.
        /// </summary>
        private string nombreMes;

        /// <summary>
        /// Obtiene o establece el nombre del mes
        /// </summary>
        public string NombreMes
        {
            get
            {
                return Mes == null ? string.Empty : Enum.GetName(typeof(Meses), Mes);
            }
        }

        /// <summary>
        /// Obtiene o establece el estatus de ejecución
        /// </summary>
        public string Estatus { get; set; }

        /// <summary>
        /// Obtiene o establece el estatus de ejecucion si no es ejecutado el valor es cero
        /// </summary>
        public int IdEstatus { get; set; }

        /// <summary>
        /// Obtiene o establece la fecha de inicio de la ejecución del proyecto.
        /// </summary>
        public DateTime? InicioEjecucion { get; set; }

        /// <summary>
        /// Obtiene o establece la fecha fin de la ejecución del proyecto.
        /// </summary>
        public DateTime? FinEjecución { get; set; }

        /// <summary>
        /// Obtiene o establece el nombre del ejecutor del proyecto.
        /// </summary>
        public string Ejecutante { get; set; }

        public bool Equals(ConsultaEjecucionProyectoInfo left, ConsultaEjecucionProyectoInfo right)
        {
            if (left == null && right == null) { return true; }
            if (left == null || right == null) { return false; }
            return left.IdProyecto == right.IdProyecto
                && left.Año == right.Año
                && left.Ejecutante == right.Ejecutante
                && left.Estatus == right.Estatus
                && left.FinEjecución == right.FinEjecución
                && left.IdEjecutante == right.IdEjecutante
                && left.IdPeriodoInformacion == right.IdPeriodoInformacion
                && left.InicioEjecucion == right.InicioEjecucion
                && left.Mes == right.Mes
                && left.NombreMes == right.nombreMes
                && left.NombreProyecto == right.NombreProyecto
                && left.PeriodoCarga == right.PeriodoCarga
                && left.IdEstatus == right.IdEstatus;
        }

        public override bool Equals(object obj)
        {
            if (obj.GetType() != typeof(ConsultaEjecucionProyectoInfo))
            {
                return false;
            }
            var right = (ConsultaEjecucionProyectoInfo)obj;
            return this.IdProyecto == right.IdProyecto
                && this.Año == right.Año
                && this.Ejecutante == right.Ejecutante
                && this.Estatus == right.Estatus
                && this.FinEjecución == right.FinEjecución
                && this.IdEjecutante == right.IdEjecutante
                && this.IdPeriodoInformacion == right.IdPeriodoInformacion
                && this.InicioEjecucion == right.InicioEjecucion
                && this.Mes == right.Mes
                && this.NombreMes == right.NombreMes
                && this.NombreProyecto == right.NombreProyecto
                && this.PeriodoCarga == right.PeriodoCarga
                 && this.IdEstatus == right.IdEstatus;
        }

        public int GetHashCode(ConsultaEjecucionProyectoInfo item)
        {
            return item.IdProyecto == null ? 0 : item.IdProyecto.GetHashCode();
        }
    }
}
